//! JSON配置示例

use unichar::{Unichar, Config, Style};

fn main() {
    println!("=== Unichar JSON配置示例 ===\n");

    // 1. 创建自定义配置并保存为JSON
    println!("1. 创建并保存自定义配置:");
    
    let custom_config = Config::new()
        .with_style(Style::Icon)
        .with_color(true)
        .add_alias("ok".to_string(), "success".to_string())
        .add_alias("fail".to_string(), "error".to_string())
        .add_alias("warn".to_string(), "warning".to_string())
        .add_alias("info".to_string(), "info".to_string());

    let mut unichar = Unichar::with_config(custom_config);
    
    // 保存配置到JSON文件
    match unichar.save_config_to_file("my_config.json") {
        Ok(_) => println!("   配置已保存到 my_config.json"),
        Err(e) => println!("   保存失败: {}", e),
    }
    println!();

    // 2. 从JSON字符串加载配置
    println!("2. 从JSON字符串加载配置:");
    
    let json_config = r#"{
  "style": "Color",
  "enable_color": true,
  "enable_ansi": true,
  "custom_styles": {},
  "aliases": {
    "success": "success",
    "error": "error",
    "warning": "warning"
  }
}"#;

    match unichar.load_config_from_json(json_config) {
        Ok(_) => {
            println!("   配置加载成功!");
            println!("   当前样式: {:?}", unichar.config().style);
            println!("   启用颜色: {}", unichar.config().enable_color);
            println!("   启用ANSI: {}", unichar.config().enable_ansi);
            println!("   别名数量: {}", unichar.config().aliases.len());
            
            // 测试加载后的配置
            println!("   测试字符显示:");
            println!("     成功: {}", unichar.get("success").unwrap_or("未找到"));
            println!("     错误: {}", unichar.get("error").unwrap_or("未找到"));
            println!("     警告: {}", unichar.get("warning").unwrap_or("未找到"));
        }
        Err(e) => println!("   加载失败: {}", e),
    }
    println!();

    // 3. 从文件加载配置
    println!("3. 从文件加载配置:");
    
    let mut file_unichar = Unichar::new();
    match file_unichar.load_config_from_file("my_config.json") {
        Ok(_) => {
            println!("   从文件加载配置成功!");
            println!("   样式: {:?}", file_unichar.config().style);
            println!("   启用颜色: {}", file_unichar.config().enable_color);
            println!("   别名: {:?}", file_unichar.config().aliases);
            
            // 测试别名功能
            println!("   测试别名:");
            println!("     ok -> {}", file_unichar.get("ok").unwrap_or("未找到"));
            println!("     fail -> {}", file_unichar.get("fail").unwrap_or("未找到"));
            println!("     warn -> {}", file_unichar.get("warn").unwrap_or("未找到"));
        }
        Err(e) => println!("   从文件加载失败: {}", e),
    }
    println!();

    // 4. 展示不同JSON配置的效果
    println!("4. 不同JSON配置的效果对比:");
    
    let configs = [
        ("简单配置", r#"{"style": "Simple", "enable_color": false, "enable_ansi": false}"#),
        ("图标配置", r#"{"style": "Icon", "enable_color": false, "enable_ansi": true}"#),
        ("彩色配置", r#"{"style": "Color", "enable_color": true, "enable_ansi": true}"#),
    ];

    for (name, json) in configs {
        let mut test_unichar = Unichar::new();
        if let Ok(_) = test_unichar.load_config_from_json(json) {
            println!("   {}: {:?} - {}", 
                    name, 
                    test_unichar.config().style,
                    test_unichar.get("success").unwrap_or("未找到"));
        }
    }
    println!();

    // 5. 复杂的JSON配置示例
    println!("5. 复杂JSON配置示例:");
    
    let complex_json = r#"{
  "style": "Icon",
  "enable_color": true,
  "enable_ansi": true,
  "custom_styles": {
    "ascii": "Simple",
    "emoji": "Icon"
  },
  "aliases": {
    "check": "success",
    "x": "error",
    "!": "warning",
    "?": "info",
    "heart": "heart",
    "star": "star"
  }
}"#;

    let mut complex_unichar = Unichar::new();
    match complex_unichar.load_config_from_json(complex_json) {
        Ok(_) => {
            println!("   复杂配置加载成功!");
            println!("   样式: {:?}", complex_unichar.config().style);
            println!("   自定义样式数量: {}", complex_unichar.config().custom_styles.len());
            println!("   别名数量: {}", complex_unichar.config().aliases.len());
            
            println!("   测试别名:");
            let aliases = ["check", "x", "!", "?", "heart", "star"];
            for alias in aliases {
                println!("     {} -> {}", alias, complex_unichar.get(alias).unwrap_or("未找到"));
            }
        }
        Err(e) => println!("   复杂配置加载失败: {}", e),
    }
    println!();

    // 6. JSON配置的错误处理
    println!("6. JSON配置错误处理:");
    
    let invalid_jsons = [
        ("无效JSON", r#"{"style": "Icon", "enable_color": true"#),
        ("无效样式", r#"{"style": "InvalidStyle", "enable_color": true}"#),
        ("空JSON", r#"{}"#),
    ];

    for (name, invalid_json) in invalid_jsons {
        let mut test_unichar = Unichar::new();
        match test_unichar.load_config_from_json(invalid_json) {
            Ok(_) => println!("   {}: 加载成功", name),
            Err(e) => println!("   {}: 加载失败 - {}", name, e),
        }
    }
    println!();

    // 清理临时文件
    let _ = std::fs::remove_file("my_config.json");
    println!("7. 清理完成，临时文件已删除。");
}
